package edu.kufpg.armatus.activity; import android.graphics.Color; import android.os.Bundle; import android.text.Spannable; import android.text.SpannableString; import android.text.Spanned; import android.text.style.DynamicDrawableSpan; import android.text.style.ImageSpan; import android.view.MotionEvent; import android.view.ScaleGestureDetector; import android.widget.TextView; import edu.kufpg.armatus.R; import edu.kufpg.armatus.console.ConsoleActivity; import edu.kufpg.armatus.console.ConsoleEntry; import edu.kufpg.armatus.data.Glyph; import edu.kufpg.armatus.gesture.OnPinchZoomListener; import edu.kufpg.armatus.util.StringUtils; import edu.kufpg.armatus.util.TextDrawable; public class ConsoleEntrySelectionActivity extends ConsoleEntryActivity { private static final int DEFAULT_TEXT_SIZE = 17; private Spannable mSpans; private ScaleGestureDetector mScaleGestureDetector; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.console_entry_selection_activity); final TextView selectableView = (TextView) findViewById(R.id.console_entry_selection_view); final OnPinchZoomListener zoomListener = new OnPinchZoomListener(this, DEFAULT_TEXT_SIZE) { @Override public void onScaleEnd(ScaleGestureDetector detector) { for (ImageSpan span : mSpans.getSpans(0, mSpans.length(), ImageSpan.class)) { TextDrawable td = (TextDrawable) span.getDrawable(); td.setTextSize(getIntSize()); td.setBounds(0, 0, td.getIntrinsicWidth(), td.getIntrinsicHeight()); } selectableView.setText(mSpans); super.onScaleEnd(detector); } }; mScaleGestureDetector = new ScaleGestureDetector(this, zoomListener); if (savedInstanceState == null) { ConsoleEntry entry = getEntry(); String baseText = StringUtils.noFirstLine(StringUtils.noCharWrap(entry.getShortContents().toString())); selectableView.setText(baseText); int defaultColor = selectableView.getCurrentTextColor(); Spannable selectableSpans = new SpannableString(selectableView.getText()); int index = 0; for (Glyph glyph : entry.getCommandResponse().getGlyphs()) { String contents = glyph.getText(); if (contents.contains("\n") || contents.contains("\t")) { String sanitizedContents = contents.replaceAll("[\n\t]", ""); index += contents.length() - sanitizedContents.length(); contents = sanitizedContents; } TextDrawable drawable = new TextDrawable(this); drawable.setText(contents); String color = glyph.getColor(); if (color != null) { drawable.setTextColor(Color.parseColor(color)); } else { drawable.setTextColor(defaultColor); } drawable.setTextSize(DEFAULT_TEXT_SIZE); drawable.setTypeface(ConsoleActivity.TYPEFACE); drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); ImageSpan imageSpan = new ImageSpan(drawable, DynamicDrawableSpan.ALIGN_BASELINE); selectableSpans.setSpan(imageSpan, index, index + contents.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); index += contents.length(); } mSpans = selectableSpans; } else { mSpans = (Spannable) savedInstanceState.getCharSequence("selectableContents"); } selectableView.setText(mSpans); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putCharSequence("selectableContents", mSpans); } @Override public boolean onTouchEvent(MotionEvent event) { mScaleGestureDetector.onTouchEvent(event); return super.onTouchEvent(event); } }